package de.draufi;
import java.io.File;

import de.draufi.logging.myLogger;
import de.draufi.tools.stringtools;
import de.draufi.tracking.Wegpunkt;
import de.draufi.xml.GPXReader;


public class Lauf {

	private Wegpunkt Startpunkt = null;
	private Wegpunkt Endpunkt = null;
	private Wegpunkt[] wp = null;
	
	private static final String AppName = "RunningMan";
	private static final int AppVersionMain = 0;
	private static final int AppVersionMayor = 0;
	private static final int AppVersionMinor = 0;
	private static final int AppVersionBuild = 1;
	private static final String AppAuthor = "Thomas";
	
	public static void main(String[] args) {
		
		System.out.println(getHello());
		
		if (args.length == 1) {
			new Lauf(new File(args[0]));
		} else {
			File files[] = new File("import/activities").listFiles();
			if (files != null){
				if (files.length > 0) {
					for (int i = 0; i < files.length; i++) {
						new Lauf(files[i]);
					}
				} else {
					System.out.println("Standard-Import-Ordner ohne Inhalt, keine Datei übergeben.");
				}
			} else {
				System.out.println("Standard-Import-Ordner ohne Inhalt, keine Datei übergeben.");
			}
		} 
		System.out.println("\nEnde");
	}
	
	
	public Lauf(File f){
		
		if (f.getName().toLowerCase().endsWith("gpx")){
			GPXReader gpx = new GPXReader(f);	
			gpx.getTrack();
			
			Startpunkt = gpx.getStrecke(0).getStart();
			Endpunkt = gpx.getStrecke(0).getEnde();
			
			System.out.println("Startpunkt: " + Startpunkt.toString(Wegpunkt.format_GMdS));
			System.out.println("Endpunkt  : " + Endpunkt.toString(Wegpunkt.format_GMdS));
			System.out.println("effektive Strecke         : " + Wegpunkt.getDistanceStr(Startpunkt.getDistance(Endpunkt)));
			System.out.println("effektive Dauer           : " + Wegpunkt.getDurationStr(Startpunkt.getDuration(Endpunkt)));
			System.out.println("effektive Geschwindigkeit : " + Wegpunkt.getSpeedStr(Startpunkt.getSpeed(Endpunkt)));
			System.out.println("effektive Geschwindigkeit : " + Wegpunkt.getPaceStr(Startpunkt.getSpeed(Endpunkt)));
			System.out.println("*****************************************************************\n");
			
			wp = gpx.getStrecke(0).getWayPoints();
			
			play(0,wp.length-1, wp, true, true, false);
			
			System.out.println("\n\nDie einzelnen 5 Minuten:");
			
			Analyse a = new Analyse(wp);
			int p1=0;
			int p2=a.getWPidx_Time(p1, 1000*60*5);
			while (p2 < wp.length) {
				play(p1, p2, wp, false, false, false);
				p1=p2;
				p2=a.getWPidx_Time(p1, 1000*60*5);
			}
			
			
		} else {
			myLogger.getLog(this.getClass().getName()).warning(f + " kann nicht verbeitet werden.");
		}
		
	}

	private static void play(int von, int bis, Wegpunkt[] wp, boolean hl, boolean tabhl, boolean einzel) {
		final int sp1 = 6;
		final int sp2 = 6;
		final int sp3 = 10;
		final int sp4 = 10;
		final int sp5 = 15;
		final int sp6 = 12;
		
		if (hl) {
			System.out.println("Der Lauf enthält " + wp.length + " Einzelpunkte");
		}
		
		if (tabhl) {
			System.out.print(stringtools.upsize("Punkt", sp1+sp2+3, stringtools.SPACE, stringtools.RECHTS));
			System.out.print(" ");
			System.out.print(stringtools.upsize("Strecke", sp3, stringtools.SPACE, stringtools.RECHTS));
			System.out.print(" ");
			System.out.print(stringtools.upsize("Zeit", sp4, stringtools.SPACE, stringtools.RECHTS));
			System.out.print(" ");
			System.out.print(stringtools.upsize("Geschwindigkeit", sp5, stringtools.SPACE, stringtools.RECHTS));
			System.out.print(" ");
			System.out.print(stringtools.upsize("Pace", sp6, stringtools.SPACE, stringtools.RECHTS));
			System.out.print("\n");
			System.out.println("-----------------------------------------------------------");
		}
		
		if (einzel) {
			for (int i=von; i<bis; i++){
				Wegpunkt w0 = wp[i];
				Wegpunkt w1 = wp[i+1];
				System.out.print(stringtools.upsize(""+(i+1), sp1+sp2+3, stringtools.SPACE, stringtools.RECHTS));
				System.out.print(" ");
				System.out.print(stringtools.upsize(Wegpunkt.getDistanceStr(w0.getDistance(w1)), sp3, stringtools.SPACE, stringtools.RECHTS));
				System.out.print(" ");
				System.out.print(stringtools.upsize(Wegpunkt.getDurationStr(w0.getDuration(w1)), sp4, stringtools.SPACE, stringtools.RECHTS));
				System.out.print(" ");
				System.out.print(stringtools.upsize(Wegpunkt.getSpeedStr(w0.getSpeed(w1)), sp5, stringtools.SPACE, stringtools.RECHTS));
				System.out.print(" ");
				System.out.print(stringtools.upsize(Wegpunkt.getPaceStr(w0.getSpeed(w1)), sp6, stringtools.SPACE, stringtools.RECHTS));
				System.out.print("\n");
			}
		}
		Analyse a = new Analyse(wp);
		System.out.print(stringtools.upsize("" + von, sp1, stringtools.SPACE, stringtools.RECHTS));
		System.out.print(" - ");
		System.out.print(stringtools.upsize("" + bis, sp1, stringtools.SPACE, stringtools.RECHTS));
		System.out.print(" ");
		System.out.print(stringtools.upsize(Wegpunkt.getDistanceStr(a.getDistance(von, bis)), sp3, stringtools.SPACE, stringtools.RECHTS));
		System.out.print(" ");
		System.out.print(stringtools.upsize(Wegpunkt.getDurationStr(a.getDuration(von, bis)), sp4, stringtools.SPACE, stringtools.RECHTS));
		System.out.print(" ");
		System.out.print(stringtools.upsize(Wegpunkt.getSpeedStr(a.getSpeed(von, bis)), sp5, stringtools.SPACE, stringtools.RECHTS));
		System.out.print(" ");
		System.out.print(stringtools.upsize(Wegpunkt.getPaceStr(a.getSpeed(von, bis)), sp6, stringtools.SPACE, stringtools.RECHTS));
		System.out.print("\n");
	}
	
	private static String getHello(){
		String result = AppName + " (vers " + getAppVers() + ")\n" +
						"Author: " + getAuthor() + "\n";
		return result;
	}
	
	private static String getAppVers(){
		String result = AppVersionMain + "." + 
						AppVersionMayor + "." +
						AppVersionMinor + "." +
						AppVersionBuild;
		return result;
	}
	
	private static String getAuthor(){
		String result = AppAuthor;
		return result;
	}
}
